bitkeeper revision 1.1159.258.57 (42372654d-IcZSg1-hScBU0TITRVfg)
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 15 Mar 2005 18:15:48 +0000 (18:15 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 15 Mar 2005 18:15:48 +0000 (18:15 +0000)
Define new io_remap_pfn_range() for mapping device space into user
applications. Patch drivers to use this instead of remap_pfn_range()
where appropriate. This patch should be pushed upstream to the kernel
maintainers.
Signed-off-by: Keir Fraser <keir@xensource.com>
.rootkeys
linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h
patches/linux-2.6.11/iomap.patch [new file with mode: 0644]

index a495f8ea158386e16d0945336580ad992eea77f4..da85fa482676bd6d615f16f313de8741af9ca886 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
 422e4430-gOD358H8nGGnNWes08Nng netbsd-2.0-xen-sparse/sys/miscfs/kernfs/kernfs_vnops.c
 413cb3b53nyOv1OIeDSsCXhBFDXvJA netbsd-2.0-xen-sparse/sys/nfs/files.nfs
 413aa1d0oNP8HXLvfPuMe6cSroUfSA patches/linux-2.6.11/agpgart.patch
+42372652KCUP-IOH9RN19YQmGhs4aA patches/linux-2.6.11/iomap.patch
 418abc69J3F638vPO9MYoDGeYilxoQ patches/linux-2.6.11/nettel.patch
 3f776bd1Hy9rn69ntXBhPReUFw9IEA tools/Makefile
 40e1b09db5mN69Ijj0X_Eol-S7dXiw tools/Rules.mk
index ddbb68e68134d746435a709838cc77b34c6168e1..de594a8a6d7c0658a383ff8933d8b389e6aa4abe 100644 (file)
@@ -485,7 +485,10 @@ int __direct_remap_area_pages(struct mm_struct *mm,
                              mmu_update_t *v);
 
 #define io_remap_page_range(vma,from,phys,size,prot) \
-       direct_remap_area_pages(vma->vm_mm,from,phys,size,prot,DOMID_IO)
+direct_remap_area_pages(vma->vm_mm,from,phys,size,prot,DOMID_IO)
+
+#define io_remap_pfn_range(vma,from,pfn,size,prot) \
+direct_remap_area_pages(vma->vm_mm,from,pfn<<PAGE_SHIFT,size,prot,DOMID_IO)
 
 #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
 #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
diff --git a/patches/linux-2.6.11/iomap.patch b/patches/linux-2.6.11/iomap.patch
new file mode 100644 (file)
index 0000000..81b4f3f
--- /dev/null
@@ -0,0 +1,120 @@
+diff -ur linux-2.6.11/drivers/char/agp/frontend.c linux-2.6.11-io/drivers/char/agp/frontend.c
+--- linux-2.6.11/drivers/char/agp/frontend.c   2005-03-02 07:37:49.000000000 +0000
++++ linux-2.6.11-io/drivers/char/agp/frontend.c        2005-03-15 17:38:30.000000000 +0000
+@@ -627,7 +627,7 @@
+               DBG("client vm_ops=%p", kerninfo.vm_ops);
+               if (kerninfo.vm_ops) {
+                       vma->vm_ops = kerninfo.vm_ops;
+-              } else if (remap_pfn_range(vma, vma->vm_start,
++              } else if (io_remap_pfn_range(vma, vma->vm_start,
+                               (kerninfo.aper_base + offset) >> PAGE_SHIFT,
+                                           size, vma->vm_page_prot)) {
+                       goto out_again;
+@@ -643,7 +643,7 @@
+               DBG("controller vm_ops=%p", kerninfo.vm_ops);
+               if (kerninfo.vm_ops) {
+                       vma->vm_ops = kerninfo.vm_ops;
+-              } else if (remap_pfn_range(vma, vma->vm_start,
++              } else if (io_remap_pfn_range(vma, vma->vm_start,
+                                           kerninfo.aper_base >> PAGE_SHIFT,
+                                           size, vma->vm_page_prot)) {
+                       goto out_again;
+diff -ur linux-2.6.11/drivers/char/drm/drm_vm.c linux-2.6.11-io/drivers/char/drm/drm_vm.c
+--- linux-2.6.11/drivers/char/drm/drm_vm.c     2005-03-02 07:38:33.000000000 +0000
++++ linux-2.6.11-io/drivers/char/drm/drm_vm.c  2005-03-15 17:43:26.000000000 +0000
+@@ -630,7 +630,7 @@
+                                       vma->vm_end - vma->vm_start,
+                                       vma->vm_page_prot, 0))
+ #else
+-              if (remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start,
++              if (io_remap_pfn_range(vma, vma->vm_start,
+                                    (VM_OFFSET(vma) + offset) >> PAGE_SHIFT,
+                                    vma->vm_end - vma->vm_start,
+                                    vma->vm_page_prot))
+diff -ur linux-2.6.11/drivers/char/drm/i810_dma.c linux-2.6.11-io/drivers/char/drm/i810_dma.c
+--- linux-2.6.11/drivers/char/drm/i810_dma.c   2005-03-02 07:37:55.000000000 +0000
++++ linux-2.6.11-io/drivers/char/drm/i810_dma.c        2005-03-15 17:53:36.000000000 +0000
+@@ -139,7 +139,7 @@
+       buf_priv->currently_mapped = I810_BUF_MAPPED;
+       unlock_kernel();
+-      if (remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start,
++      if (io_remap_pfn_range(vma, vma->vm_start,
+                            VM_OFFSET(vma) >> PAGE_SHIFT,
+                            vma->vm_end - vma->vm_start,
+                            vma->vm_page_prot)) return -EAGAIN;
+diff -ur linux-2.6.11/drivers/char/drm/i830_dma.c linux-2.6.11-io/drivers/char/drm/i830_dma.c
+--- linux-2.6.11/drivers/char/drm/i830_dma.c   2005-03-02 07:37:48.000000000 +0000
++++ linux-2.6.11-io/drivers/char/drm/i830_dma.c        2005-03-15 17:53:46.000000000 +0000
+@@ -157,7 +157,7 @@
+       buf_priv->currently_mapped = I830_BUF_MAPPED;
+       unlock_kernel();
+-      if (remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start,
++      if (io_remap_pfn_range(vma, vma->vm_start,
+                            VM_OFFSET(vma) >> PAGE_SHIFT,
+                            vma->vm_end - vma->vm_start,
+                            vma->vm_page_prot)) return -EAGAIN;
+diff -ur linux-2.6.11/drivers/char/hpet.c linux-2.6.11-io/drivers/char/hpet.c
+--- linux-2.6.11/drivers/char/hpet.c   2005-03-02 07:38:10.000000000 +0000
++++ linux-2.6.11-io/drivers/char/hpet.c        2005-03-15 17:37:22.000000000 +0000
+@@ -76,6 +76,7 @@
+ struct hpets {
+       struct hpets *hp_next;
+       struct hpet __iomem *hp_hpet;
++      unsigned long hp_hpet_phys;
+       struct time_interpolator *hp_interpolator;
+       unsigned long hp_period;
+       unsigned long hp_delta;
+@@ -265,7 +266,7 @@
+               return -EINVAL;
+       devp = file->private_data;
+-      addr = (unsigned long)devp->hd_hpet;
++      addr = devp->hd_hpets->hp_hpet_phys;
+       if (addr & (PAGE_SIZE - 1))
+               return -ENOSYS;
+@@ -274,7 +275,7 @@
+       vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+       addr = __pa(addr);
+-      if (remap_pfn_range(vma, vma->vm_start, addr >> PAGE_SHIFT,
++      if (io_remap_pfn_range(vma, vma->vm_start, addr >> PAGE_SHIFT,
+                                       PAGE_SIZE, vma->vm_page_prot)) {
+               printk(KERN_ERR "remap_pfn_range failed in hpet.c\n");
+               return -EAGAIN;
+@@ -795,6 +796,7 @@
+       hpetp->hp_which = hpet_nhpet++;
+       hpetp->hp_hpet = hdp->hd_address;
++      hpetp->hp_hpet_phys = hdp->hd_phys_address;
+       hpetp->hp_ntimer = hdp->hd_nirqs;
+diff -ur linux-2.6.11/drivers/sbus/char/flash.c linux-2.6.11-io/drivers/sbus/char/flash.c
+--- linux-2.6.11/drivers/sbus/char/flash.c     2005-03-02 07:38:10.000000000 +0000
++++ linux-2.6.11-io/drivers/sbus/char/flash.c  2005-03-15 17:20:22.000000000 +0000
+@@ -75,7 +75,7 @@
+       pgprot_val(vma->vm_page_prot) |= _PAGE_E;
+       vma->vm_flags |= (VM_SHM | VM_LOCKED);
+-      if (remap_pfn_range(vma, vma->vm_start, addr, size, vma->vm_page_prot))
++      if (io_remap_pfn_range(vma, vma->vm_start, addr, size, vma->vm_page_prot))
+               return -EAGAIN;
+               
+       return 0;
+diff -ur linux-2.6.11/include/linux/mm.h linux-2.6.11-io/include/linux/mm.h
+--- linux-2.6.11/include/linux/mm.h    2005-03-02 07:37:47.000000000 +0000
++++ linux-2.6.11-io/include/linux/mm.h 2005-03-15 17:03:46.000000000 +0000
+@@ -815,6 +815,10 @@
+ extern int check_user_page_readable(struct mm_struct *mm, unsigned long address);
+ int remap_pfn_range(struct vm_area_struct *, unsigned long,
+               unsigned long, unsigned long, pgprot_t);
++/* Allow arch override for mapping of device and I/O (non-RAM) pages. */
++#ifndef io_remap_pfn_range
++#define io_remap_pfn_range remap_pfn_range
++#endif
+ #ifdef CONFIG_PROC_FS
+ void __vm_stat_account(struct mm_struct *, unsigned long, struct file *, long);